home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Resources / Online / Term / Extras / Source / gtlayout-source.lha / LTP_LayoutGadgets.c < prev    next >
C/C++ Source or Header  |  1996-10-08  |  26KB  |  983 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1996 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. #ifdef DO_BOOPSI_KIND
  15. STATIC VOID
  16. LocalAddPart(STRPTR Base,STRPTR Name)
  17. {
  18.     LONG Len = strlen(Base);
  19.  
  20.     if(Base[Len - 1] != ':')
  21.         strcat(Base,"/");
  22.  
  23.     strcat(Base,Name);
  24. }
  25.  
  26. STATIC struct Library *
  27. OpenClass(STRPTR Name)
  28. {
  29.     struct Library *Result;
  30.  
  31.     if(!(Result = OpenLibrary(Name,0)))
  32.     {
  33.         struct Process    *Process = (struct Process *)FindTask(NULL);
  34.         UBYTE             LocalBuffer[256];
  35.         LONG             i,Len;
  36.  
  37.         Len = strlen(Name);
  38.  
  39.         for(i = Len - 1 ; i >= 0 ; i--)
  40.         {
  41.             if(Name[i] == '/' || Name[i] == ':')
  42.             {
  43.                 Name = &Name[i + 1];
  44.  
  45.                 break;
  46.             }
  47.         }
  48.  
  49.         if(Process->pr_Task.tc_Node.ln_Type == NT_PROCESS && Process->pr_HomeDir)
  50.         {
  51.             strcpy(LocalBuffer,"PROGDIR:Classes/Gadgets");
  52.             LocalAddPart(LocalBuffer,Name);
  53.  
  54.             Result = OpenLibrary(LocalBuffer,0);
  55.         }
  56.  
  57.         if(!Result)
  58.         {
  59.             strcpy(LocalBuffer,":Classes/Gadgets");
  60.             LocalAddPart(LocalBuffer,Name);
  61.  
  62.             if(!(Result = OpenLibrary(LocalBuffer,0)))
  63.             {
  64.                 strcpy(LocalBuffer,"Gadgets");
  65.                 LocalAddPart(LocalBuffer,Name);
  66.  
  67.                 if(!(Result = OpenLibrary(LocalBuffer,0)))
  68.                     Result = OpenLibrary(Name,0);
  69.             }
  70.         }
  71.     }
  72.  
  73.     return(Result);
  74. }
  75. #endif    /* DO_BOOPSI_KIND */
  76.  
  77.  
  78. /*****************************************************************************/
  79.  
  80.  
  81. VOID
  82. LTP_LayoutGadgets(LayoutHandle *Handle,ObjectNode *Group,LONG Left,LONG Top,LONG PlusWidth,LONG PlusHeight)
  83. {
  84.     if(!Handle->Failed)
  85.     {
  86.         STATIC struct TagItem NoUnderscoreVanillaTags[] =
  87.         {
  88.             {TAG_DONE}
  89.         };
  90.  
  91.         STATIC struct TagItem VanillaTags[] =
  92.         {
  93.             {GT_Underscore, '_'},
  94.             {TAG_DONE}
  95.         };
  96.  
  97.         STATIC struct TagItem DisabledTags[] =
  98.         {
  99.             {GT_Underscore, '_' },
  100.             {GA_Disabled,    TRUE},
  101.             {TAG_DONE}
  102.         };
  103.  
  104.         STATIC struct TagItem NoUnderscoreDisabledTags[] =
  105.         {
  106.             {GA_Disabled,    TRUE},
  107.             {TAG_DONE}
  108.         };
  109.  
  110.         struct NewGadget     NewGadget;
  111.  
  112.         struct Gadget        *Gadget,
  113.                             *Extra;
  114.         struct TagItem        *Tags;
  115.         ULONG                 page;
  116.         ObjectNode            *Node;
  117.  
  118.         if(!Handle->List)
  119.         {
  120.             if(!(Handle->Previous = CreateContext(&Handle->List)))
  121.             {
  122.                 Handle->Failed = TRUE;
  123.  
  124.                 return;
  125.             }
  126.         }
  127.  
  128.         NewGadget.ng_TextAttr   = Handle->TextAttr;
  129.         NewGadget.ng_VisualInfo = Handle->VisualInfo;
  130.  
  131.         Group->Special.Group.Visible = TRUE;
  132.  
  133.         SCANPAGE(Group,Node,page)
  134.         {
  135.             if(Node->Type != FRAME_KIND && Node->Type != BLANK_KIND && Node->Type != BOX_KIND && Node->Type != XBAR_KIND && Node->Type != YBAR_KIND)
  136.             {
  137.                 Extra = NULL;
  138.  
  139.                 if(Node->GroupIndent)
  140.                 {
  141.                     NewGadget.ng_LeftEdge     = Node->Left + 4;
  142.                     NewGadget.ng_TopEdge    = Node->Top + 2;
  143.                     NewGadget.ng_Width        = Node->Width - (4 + 4);
  144.                     NewGadget.ng_Height        = Node->Height - (2 + 2);
  145.                 }
  146.                 else
  147.                 {
  148.                     NewGadget.ng_LeftEdge     = Node->Left;
  149.                     NewGadget.ng_TopEdge    = Node->Top;
  150.                     NewGadget.ng_Width        = Node->Width;
  151.                     NewGadget.ng_Height        = Node->Height;
  152.                 }
  153.  
  154.                 NewGadget.ng_GadgetText    = Node->Label ? Node->Label : (STRPTR)"";
  155.                 NewGadget.ng_GadgetID     = Node->ID;
  156.                 NewGadget.ng_UserData     = Node;
  157.  
  158.                 if(Node->NoKey)
  159.                 {
  160.                     if(Node->Disabled)
  161.                     {
  162.                         if(!V39 && (Node->Type == MX_KIND || Node->Type == LISTVIEW_KIND))
  163.                             Tags = NoUnderscoreVanillaTags;
  164.                         else
  165.                             Tags = NoUnderscoreDisabledTags;
  166.                     }
  167.                     else
  168.                         Tags = NoUnderscoreVanillaTags;
  169.                 }
  170.                 else
  171.                 {
  172.                     if(Node->Disabled)
  173.                     {
  174.                         if(!V39 && (Node->Type == MX_KIND || Node->Type == LISTVIEW_KIND))
  175.                             Tags = VanillaTags;
  176.                         else
  177.                             Tags = DisabledTags;
  178.                     }
  179.                     else
  180.                         Tags = VanillaTags;
  181.                 }
  182.  
  183.                 switch(Node->LabelPlace)
  184.                 {
  185.                     case PLACE_LEFT:
  186.  
  187.                         NewGadget.ng_Flags = PLACETEXT_LEFT;
  188.                         break;
  189.  
  190.                     case PLACE_RIGHT:
  191.  
  192.                         NewGadget.ng_Flags = PLACETEXT_RIGHT;
  193.                         break;
  194.  
  195.                     case PLACE_ABOVE:
  196.  
  197.                         NewGadget.ng_Flags = PLACETEXT_ABOVE;
  198.                         break;
  199.  
  200.                     case PLACE_BELOW:
  201.  
  202.                         NewGadget.ng_Flags = PLACETEXT_BELOW;
  203.                         break;
  204.  
  205.                     case PLACE_IN:
  206.  
  207.                         NewGadget.ng_Flags = PLACETEXT_IN;
  208.                         break;
  209.  
  210.                     default:
  211.  
  212.                         NewGadget.ng_Flags = NULL;
  213.                         break;
  214.                 }
  215.  
  216.                 if(Node->HighLabel)
  217.                     NewGadget.ng_Flags |= NG_HIGHLABEL;
  218.  
  219.                 switch(Node->Type)
  220.                 {
  221. #ifdef DO_BOOPSI_KIND
  222.                     case BOOPSI_KIND:
  223.                     {
  224.                         struct Gadget *Link;
  225.  
  226.                         if(Node->Special.BOOPSI.Link != NIL_LINK && Node->Special.BOOPSI.TagLink)
  227.                         {
  228.                             if(!(Link = LTP_FindGadget(Handle,Node->Special.BOOPSI.Link)))
  229.                             {
  230.                                 Handle->Failed = TRUE;
  231.  
  232.                                 return;
  233.                             }
  234.                         }
  235.                         else
  236.                             Link = NULL;
  237.  
  238.                         if(Node->Special.BOOPSI.ClassLibraryName)
  239.                         {
  240.                             if(!(Node->Special.BOOPSI.ClassBase = OpenClass(Node->Special.BOOPSI.ClassLibraryName)))
  241.                             {
  242.                                 Gadget = NULL;
  243.  
  244.                                 break;
  245.                             }
  246.                         }
  247.  
  248.                         if(Node->Special.BOOPSI.FullWidth)
  249.                         {
  250.                             NewGadget.ng_LeftEdge    = Node->Special.BOOPSI.Parent->Left;
  251.                             NewGadget.ng_Width        = Node->Special.BOOPSI.Parent->Width;
  252.                         }
  253.  
  254.                         if(Node->Special.BOOPSI.FullHeight)
  255.                         {
  256.                             NewGadget.ng_TopEdge    = Node->Special.BOOPSI.Parent->Top;
  257.                             NewGadget.ng_Height        = Node->Special.BOOPSI.Parent->Height;
  258.                         }
  259.  
  260.                         Gadget = NewObject(Node->Special.BOOPSI.ClassInstance,Node->Special.BOOPSI.ClassName,
  261.                             GA_Left,        NewGadget.ng_LeftEdge,
  262.                             GA_Top,            NewGadget.ng_TopEdge,
  263.                             GA_Width,        NewGadget.ng_Width,
  264.                             GA_Height,        NewGadget.ng_Height,
  265.                             GA_Disabled,    Node->Disabled,
  266.                             GA_ID,            Node->ID,
  267.                             GA_UserData,    Node,
  268.  
  269.                             Link ? Node->Special.BOOPSI.TagLink : TAG_IGNORE,                                    Link,
  270.                             Handle->BOOPSIPrevious ? GA_Previous : TAG_IGNORE,                                    Handle->BOOPSIPrevious,
  271.                             Node->Special.BOOPSI.TagTextAttr ? Node->Special.BOOPSI.TagTextAttr : TAG_IGNORE,    Handle->TextAttr,
  272.                             Node->Special.BOOPSI.TagDrawInfo ? Node->Special.BOOPSI.TagDrawInfo : TAG_IGNORE,    Handle->DrawInfo,
  273.                             Node->Special.BOOPSI.TagScreen ? Node->Special.BOOPSI.TagScreen : TAG_IGNORE,        Handle->Screen,
  274.                             Node->Special.BOOPSI.ClassTags ? TAG_MORE : TAG_DONE,                                Node->Special.BOOPSI.ClassTags);
  275.  
  276.                         break;
  277.                     }
  278.  
  279. #ifdef DO_POPUP_KIND
  280.                     case POPUP_KIND:
  281.  
  282.                         Gadget = NewObject(LTP_PopupClass,NULL,
  283.                             GA_Left,            NewGadget.ng_LeftEdge,
  284.                             GA_Top,                NewGadget.ng_TopEdge,
  285.                             GA_Width,            NewGadget.ng_Width,
  286.                             GA_Height,            NewGadget.ng_Height,
  287.                             GA_Disabled,        Node->Disabled,
  288.                             GA_ID,                Node->ID,
  289.                             GA_UserData,        Node,
  290.                             GA_RelVerify,        TRUE,
  291.                             PIA_Labels,            Node->Special.Popup.Choices,
  292.                             PIA_Active,            Node->Current,
  293.                             PIA_Font,            Handle->TextAttr,
  294.                             PIA_CentreActive,    Node->Special.Popup.CentreActive,
  295.  
  296.                             Handle->BOOPSIPrevious ? GA_Previous : TAG_IGNORE,Handle->BOOPSIPrevious,
  297.                         TAG_DONE);
  298.  
  299.                         break;
  300. #endif    // DO_POPUP_KIND
  301.  
  302. #ifdef DO_TAB_KIND
  303.                     case TAB_KIND:
  304.  
  305.                         if(Node->Special.Tab.FullWidth)
  306.                         {
  307.                             NewGadget.ng_LeftEdge    = Handle->TopGroup->Left    - Left;
  308.                             NewGadget.ng_Width        = Handle->TopGroup->Width    + PlusWidth;
  309.  
  310.                             NewGadget.ng_LeftEdge    += Handle->Screen->WBorLeft;
  311.                             NewGadget.ng_Width        -= Handle->Screen->WBorLeft + Handle->Screen->WBorRight;
  312.                         }
  313.                         else
  314.                         {
  315.                             NewGadget.ng_LeftEdge    = Node->Special.Tab.Parent->Left;
  316.                             NewGadget.ng_Width        = Node->Special.Tab.Parent->Width;
  317.                         }
  318.  
  319.                         Gadget = NewObject(LTP_TabClass,NULL,
  320.                             GA_Left,        NewGadget.ng_LeftEdge,
  321.                             GA_Top,            NewGadget.ng_TopEdge,
  322.                             GA_Width,        NewGadget.ng_Width,
  323.                             GA_Height,        NewGadget.ng_Height,
  324.                             GA_Disabled,    Node->Disabled,
  325.                             GA_ID,            Node->ID,
  326.                             GA_UserData,    Node,
  327.                             GA_RelVerify,    TRUE,
  328.                             TIA_Labels,        Node->Special.Popup.Choices,
  329.                             TIA_Index,        Node->Current,
  330.                             TIA_Font,        Handle->TextAttr,
  331.                             TIA_DrawInfo,    Handle->DrawInfo,
  332.                             TIA_Screen,        Handle->Screen,
  333.  
  334.                             Handle->BOOPSIPrevious ? GA_Previous : TAG_IGNORE,Handle->BOOPSIPrevious,
  335.                         TAG_DONE);
  336.  
  337.                         break;
  338. #endif    // DO_TAB_KIND
  339. #endif    /* DO_BOOPSI_KIND */
  340.  
  341. #ifdef DO_LEVEL_KIND
  342.                     case LEVEL_KIND:
  343.  
  344.                         if(Node->Special.Level.LevelImage = NewObject(LTP_LevelClass,NULL,
  345.                             IA_Width,        Node->Width,
  346.                             IA_Height,        Node->Height,
  347. //                            IA_Left,        0,
  348. //                            IA_Top,         0,
  349.                             LVIA_Screen,    Handle->Screen,
  350.                             LVIA_DrawInfo,    Handle->DrawInfo,
  351.                             LVIA_FontWidth, Handle->GlyphWidth,
  352.                             LVIA_Max,        Node->Max        - Node->Special.Level.Plus,
  353.                             LVIA_Current,    Node->Current    - Node->Special.Level.Plus,
  354.                         TAG_DONE))
  355.                         {
  356.                             NewGadget.ng_GadgetText    = "";
  357.                             NewGadget.ng_Flags        = NULL;
  358.  
  359.                             if(Gadget = CreateGadgetA(GENERIC_KIND,Handle->Previous,&NewGadget,NULL))
  360.                             {
  361.                                 Gadget->GadgetType    |= GTYP_CUSTOMGADGET;
  362.  
  363.                                 Gadget->Flags             = GFLG_GADGIMAGE | GFLG_GADGHIMAGE;
  364.                                 Gadget->Activation        = GACT_RELVERIFY | GACT_IMMEDIATE | GACT_FOLLOWMOUSE;
  365.                                 Gadget->MutualExclude    = (ULONG)&Node->Special.Level.CustomHook;
  366.                                 Gadget->GadgetRender    = Node->Special.Level.LevelImage;
  367.                                 Gadget->SelectRender    = Node->Special.Level.LevelImage;
  368.                                 Gadget->SpecialInfo        = &Node->Special.Level;
  369.  
  370.                                 if(Node->Disabled)
  371.                                     Gadget->Flags |= GFLG_DISABLED;
  372.                             }
  373.                         }
  374.                         else
  375.                             Gadget = NULL;
  376.  
  377.                         break;
  378. #endif    /* DO_LEVEL_KIND */
  379.                     case BUTTON_KIND:
  380.  
  381. #ifdef OLD_STYLE_DEFAULT_KEY
  382.                         if(Node->Special.Button.Lines)
  383. #else
  384.                         if(Node->Special.Button.ReturnKey)
  385.                             Handle->TextAttr->ta_Style |= FSF_BOLD;
  386.  
  387.                         if(Node->Special.Button.Lines || Node->Special.Button.ReturnKey)
  388. #endif
  389.                         {
  390.                             if(Node->Special.Button.ButtonImage = NewObject(LTP_ImageClass,NULL,
  391.                                 IIA_ImageType,    IMAGECLASS_MULTILINEBUTTON,
  392.                                 IIA_Lines,        Node->Special.Button.Lines,
  393.                                 IIA_LineCount,    Node->Special.Button.LineCount,
  394.                                 IIA_KeyStroke,    Node->Special.Button.KeyStroke,
  395.                                 IIA_Emboss,        Node->Special.Button.ReturnKey,
  396.                                 IIA_Label,        Node->Label,
  397.                                 IIA_Font,        Handle->TextAttr,
  398.                                 IA_Width,        NewGadget.ng_Width,
  399.                                 IA_Height,        NewGadget.ng_Height,
  400.                             TAG_DONE))
  401.                             {
  402.                                 NewGadget.ng_GadgetText    = "";
  403.                                 NewGadget.ng_Flags        = NULL;
  404.  
  405.                                 if(Gadget = CreateGadgetA(GENERIC_KIND,Handle->Previous,&NewGadget,NULL))
  406.                                 {
  407.                                     Gadget->GadgetType        |= GTYP_BOOLGADGET;
  408.  
  409.                                     Gadget->Flags             = GFLG_GADGIMAGE | GFLG_GADGHIMAGE;
  410.                                     Gadget->Activation        = GACT_RELVERIFY;
  411.  
  412.                                     Gadget->GadgetRender    = Node->Special.Button.ButtonImage;
  413.                                     Gadget->SelectRender    = Node->Special.Button.ButtonImage;
  414.  
  415.                                     if(Node->Disabled)
  416.                                         Gadget->Flags |= GFLG_DISABLED;
  417.                                 }
  418.                             }
  419.                             else
  420.                                 Gadget = NULL;
  421.                         }
  422.                         else
  423.                             Gadget = CreateGadgetA(BUTTON_KIND,Handle->Previous,&NewGadget,Tags);
  424. #ifndef OLD_STYLE_DEFAULT_KEY
  425.                         if(Node->Special.Button.ReturnKey)
  426.                             Handle->TextAttr->ta_Style &= ~FSF_BOLD;
  427. #endif
  428.                         break;
  429.  
  430.                     case GROUP_KIND:
  431.  
  432.                         LTP_LayoutGadgets(Handle,Node,Left,Top,PlusWidth,PlusHeight);
  433.  
  434.                         continue;
  435.  
  436.                     case CHECKBOX_KIND:
  437.  
  438.                         Gadget = CreateGadget(CHECKBOX_KIND,Handle->Previous,&NewGadget,
  439.                             GTCB_Checked,    Node->Current,
  440.                             GTCB_Scaled,    TRUE,
  441.                         TAG_MORE,Tags);
  442.  
  443.                         break;
  444.  
  445.                     case LISTVIEW_KIND:
  446.                     {
  447.                         struct TextFont *LocalFont;
  448.                         ULONG WhichTag;
  449.  
  450.                         if(!Node->Special.List.ReadOnly && Node->Special.List.LinkID != -1 && Node->Special.List.LinkID != NIL_LINK)
  451.                             Gadget = Node->Special.List.Link = LTP_FindGadget(Handle,Node->Special.List.LinkID);
  452.                         else
  453.                             Gadget = NULL;
  454.  
  455.                         if((NewGadget.ng_Flags & PLACETEXT_ABOVE) && Node->Label && Node->Special.List.FlushLabelLeft)
  456.                             NewGadget.ng_GadgetText = "";
  457.  
  458.                         if(Node->Special.List.TextAttr)
  459.                         {
  460.                                 // Use the system default font?
  461.  
  462.                             if(Node->Special.List.TextAttr == (struct TextAttr *)~0)
  463.                             {
  464.                                 Forbid();
  465.  
  466.                                 LTP_GetDefaultFont(&Handle->FixedFont);
  467.  
  468.                                 if(!(LocalFont = OpenFont((struct TextAttr *)&Handle->FixedFont)))
  469.                                 {
  470.                                     Permit();
  471.  
  472.                                     Handle->Failed = TRUE;
  473.  
  474.                                     Gadget = NULL;
  475.  
  476.                                     break;
  477.                                 }
  478.  
  479.                                 NewGadget.ng_TextAttr = (struct TextAttr *)&Handle->FixedFont;
  480.                             }
  481.                             else
  482.                             {
  483.                                 NewGadget.ng_TextAttr = Node->Special.List.TextAttr;
  484.  
  485.                                 LocalFont = NULL;
  486.                             }
  487.  
  488.                             NewGadget.ng_GadgetText = "";
  489.                         }
  490.  
  491.                         if(V39)
  492.                             WhichTag = GTLV_MakeVisible;
  493.                         else
  494.                             WhichTag = GTLV_Top;
  495.  
  496.                         Gadget = CreateGadget(LISTVIEW_KIND,Handle->Previous,&NewGadget,
  497.                             GTLV_Selected,        Node->Current,
  498.                             GTLV_ReadOnly,        Node->Special.List.ReadOnly,
  499.                             GTLV_ScrollWidth,    2 + 2 * Handle->GlyphWidth + 2,
  500.  
  501.                             Node->Current >= 0 ? WhichTag : TAG_IGNORE,                            Node->Current,
  502.                             Node->Special.List.Labels ? GTLV_Labels : TAG_IGNORE,                Node->Special.List.Labels,
  503.                             Node->Special.List.LinkID != -1 ? GTLV_ShowSelected : TAG_IGNORE,    Gadget,
  504.                             Node->Special.List.CallBack ?    GTLV_CallBack : TAG_IGNORE,            Node->Special.List.CallBack,
  505.                             Node->Special.List.MaxPen ?    GTLV_MaxPen : TAG_IGNORE,                Node->Special.List.MaxPen,
  506.                         TAG_MORE,Tags);
  507.  
  508.                         if(Node->Special.List.TextAttr)
  509.                         {
  510.                             NewGadget.ng_TextAttr = Handle->TextAttr;
  511.  
  512.                             if(LocalFont)
  513.                             {
  514.                                 CloseFont(LocalFont);
  515.  
  516.                                 Permit();
  517.                             }
  518.                         }
  519.  
  520.                         break;
  521.                     }
  522.  
  523.                     case MX_KIND:
  524.  
  525.                         NewGadget.ng_Height = Handle->GlyphHeight;
  526.  
  527.                         Gadget = CreateGadget(MX_KIND,Handle->Previous,&NewGadget,
  528.                             GTMX_Labels,    Node->Special.Radio.Choices,
  529.                             GTMX_Active,    Node->Current,
  530.                             GTMX_Spacing,    Handle->InterHeight,
  531.                             GTMX_Scaled,    TRUE,
  532.  
  533.                             Node->Label ? GTMX_TitlePlace : TAG_IGNORE,  Node->Special.Radio.TitlePlace,
  534.                         TAG_MORE,Tags);
  535.  
  536.                         break;
  537.  
  538.                     case TEXT_KIND:
  539.  
  540.                         if(Node->Special.Text.UsePicker)
  541.                             NewGadget.ng_Width -= LTP_GetPickerSize(Handle);
  542.  
  543.                         if(Gadget = CreateGadget(TEXT_KIND,Handle->Previous,&NewGadget,
  544.                             GTTX_Border,        Node->Special.Text.Border,
  545.                             GTTX_Justification,    Node->Special.Text.Justification,
  546.                             GTTX_Clipped,        TRUE,
  547.  
  548.                             Node->Special.Text.Text ? GTTX_Text : TAG_IGNORE,Node->Special.Text.Text,
  549.                             Node->Special.Text.FrontPen != -1 ? GTTX_FrontPen : TAG_IGNORE,Node->Special.Text.FrontPen,
  550.                             Node->Special.Text.BackPen != -1 ? GTTX_BackPen : TAG_IGNORE,Node->Special.Text.BackPen,
  551.                         TAG_MORE,Tags))
  552.                         {
  553.                             if(Node->Special.Text.UsePicker)
  554.                             {
  555.                                 Handle->Previous = Gadget;
  556.  
  557.                                 Extra = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_PICKER,0);
  558.  
  559.                                 if(!Extra)
  560.                                     Gadget = NULL;
  561.  
  562.                                 Node->Special.Text.Picker = Extra;
  563.                             }
  564.                         }
  565.  
  566.                         break;
  567. #ifdef DO_GAUGE_KIND
  568.                     case GAUGE_KIND:
  569.  
  570.                         NewGadget.ng_Height -= Handle->InterHeight + Handle->GlyphHeight + 2;
  571.  
  572.                         Gadget = CreateGadgetA(TEXT_KIND,Handle->Previous,&NewGadget,NULL);
  573.  
  574.                         break;
  575. #endif
  576.  
  577. #ifdef DO_TAPEDECK_KIND
  578.                     case TAPEDECK_KIND:
  579.  
  580.                         if(Node->Special.TapeDeck.ButtonType >= TDBT_BACKWARD && Node->Special.TapeDeck.ButtonType < TDBTLAST)
  581.                         {
  582.                             LONG    ImageType;
  583.                             LONG    Activation,
  584.                                     Flags;
  585.  
  586.                             if(Node->Special.TapeDeck.Toggle)
  587.                                 Activation = GACT_TOGGLESELECT | GACT_IMMEDIATE;
  588.                             else
  589.                             {
  590.                                 if(Node->Special.TapeDeck.Tick)
  591.                                 {
  592.                                     Activation = GACT_RELVERIFY | GACT_IMMEDIATE;
  593.  
  594.                                     Handle->IDCMP |= IDCMP_GADGETDOWN | IDCMP_GADGETUP | IDCMP_INTUITICKS;
  595.                                 }
  596.                                 else
  597.                                     Activation = GACT_RELVERIFY;
  598.                             }
  599.  
  600.                             if(Node->Current)
  601.                                 Flags = GFLG_GADGIMAGE | GFLG_GADGHIMAGE | GFLG_SELECTED;
  602.                             else
  603.                                 Flags = GFLG_GADGIMAGE | GFLG_GADGHIMAGE;
  604.  
  605.                             switch(Node->Special.TapeDeck.ButtonType)
  606.                             {
  607.                                 case TDBT_BACKWARD:
  608.  
  609.                                     ImageType = IMAGECLASS_BACKWARD;
  610.                                     break;
  611.  
  612.                                 case TDBT_FORWARD:
  613.  
  614.                                     ImageType = IMAGECLASS_FORWARD;
  615.                                     break;
  616.  
  617.                                 case TDBT_PREVIOUS:
  618.  
  619.                                     ImageType = IMAGECLASS_PREVIOUS;
  620.                                     break;
  621.  
  622.                                 case TDBT_NEXT:
  623.  
  624.                                     ImageType = IMAGECLASS_NEXT;
  625.                                     break;
  626.  
  627.                                 case TDBT_RECORD:
  628.  
  629.                                     ImageType = IMAGECLASS_RECORD;
  630.                                     break;
  631.  
  632.                                 case TDBT_PLAY:
  633.  
  634.                                     ImageType = IMAGECLASS_PLAY;
  635.                                     break;
  636.  
  637.                                 case TDBT_STOP:
  638.  
  639.                                     ImageType = IMAGECLASS_STOP;
  640.                                     break;
  641.  
  642.                                 case TDBT_PAUSE:
  643.  
  644.                                     ImageType = IMAGECLASS_PAUSE;
  645.                                     break;
  646.  
  647.                                 case TDBT_REWIND:
  648.  
  649.                                     ImageType = IMAGECLASS_REWIND;
  650.                                     break;
  651.  
  652.                                 case TDBT_EJECT:
  653.  
  654.                                     ImageType = IMAGECLASS_EJECT;
  655.                                     break;
  656.                             }
  657.  
  658.                             if(Node->Special.TapeDeck.ButtonImage = NewObject(LTP_ImageClass,NULL,
  659.                                 IIA_ImageType,    ImageType,
  660.                                 IIA_GlyphWidth, Node->Special.TapeDeck.ButtonWidth,
  661.                                 IIA_GlyphHeight,Node->Special.TapeDeck.ButtonHeight,
  662.                                 IA_Width,        NewGadget.ng_Width,
  663.                                 IA_Height,        NewGadget.ng_Height,
  664.                             TAG_DONE))
  665.                             {
  666.                                 NewGadget.ng_GadgetText    = "";
  667.                                 NewGadget.ng_Flags        = NULL;
  668.  
  669.                                 if(Gadget = CreateGadgetA(GENERIC_KIND,Handle->Previous,&NewGadget,NULL))
  670.                                 {
  671.                                     Gadget->GadgetType        |= GTYP_BOOLGADGET;
  672.                                     Gadget->Flags             |= Flags;
  673.                                     Gadget->Activation        |= Activation;
  674.  
  675.                                     Gadget->GadgetRender     = Node->Special.TapeDeck.ButtonImage;
  676.                                     Gadget->SelectRender     = Node->Special.TapeDeck.ButtonImage;
  677.  
  678.                                     if(Node->Disabled)
  679.                                         Gadget->Flags |= GFLG_DISABLED;
  680.                                 }
  681.                             }
  682.                             else
  683.                                 Gadget = NULL;
  684.                         }
  685.  
  686.                         break;
  687. #endif    /* DO_TAPEDECK_KIND */
  688.                     case NUMBER_KIND:
  689.  
  690.                         Gadget = CreateGadget(NUMBER_KIND,Handle->Previous,&NewGadget,
  691.                             GTNM_Number,        Node->Special.Number.Number,
  692.                             GTNM_Border,        Node->Special.Number.Border,
  693.                             GTNM_Justification,    Node->Special.Number.Justification,
  694.                             GTNM_Border,        Node->Special.Number.Border,
  695.                             GTNM_Format,        Node->Special.Number.Format ? Node->Special.Number.Format : (STRPTR)"%ld",
  696.                             GTNM_Clipped,        TRUE,
  697.                             GTNM_MaxNumberLen,    Node->Special.Number.MaxNumberLen,
  698.  
  699.                             Node->Special.Number.FrontPen != -1 ? GTNM_FrontPen : TAG_IGNORE,Node->Special.Number.FrontPen,
  700.                             Node->Special.Number.BackPen != -1 ? GTNM_BackPen : TAG_IGNORE,Node->Special.Number.BackPen,
  701.                         TAG_MORE,Tags);
  702.  
  703.                         break;
  704.  
  705.                     case CYCLE_KIND:
  706.  
  707.                         Gadget = CreateGadget(CYCLE_KIND,Handle->Previous,&NewGadget,
  708.                             GTCY_Labels,        Node->Special.Cycle.Choices,
  709.                             GTCY_Active,        Node->Current,
  710.                         TAG_MORE,Tags);
  711.  
  712.                         break;
  713.  
  714.                     case PALETTE_KIND:
  715.  
  716.                         if(Node->Special.Palette.UsePicker)
  717.                         {
  718.                             NewGadget.ng_Width = Node->Special.Palette.IndicatorWidth;
  719.  
  720.                             if(Gadget = CreateGadget(TEXT_KIND,Handle->Previous,&NewGadget,TAG_MORE,Tags))
  721.                             {
  722.                                 Handle->Previous = Gadget;
  723.  
  724.                                 Extra = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_PICKER,0);
  725.  
  726.                                 if(!Extra)
  727.                                     Gadget = NULL;
  728.  
  729.                                 Node->Special.Palette.Picker = Extra;
  730.                             }
  731.                         }
  732.                         else
  733.                         {
  734.                             Gadget = CreateGadget(PALETTE_KIND,Handle->Previous,&NewGadget,
  735.                                 GTPA_Depth,                Node->Special.Palette.Depth,
  736.                                 GTPA_Color,                Node->Current,
  737.                                 GTPA_ColorOffset,        Node->Min,
  738.                                 GTPA_IndicatorWidth,    MAX(10,Node->Width / (Node->Max - Node->Min + 1)),
  739.                                 GTPA_IndicatorHeight,    Node->Height,
  740.  
  741.                                 Node->Special.Palette.ColourTable ? GTPA_ColorTable : TAG_IGNORE,Node->Special.Palette.ColourTable,
  742.                             TAG_MORE,Tags);
  743.                         }
  744.  
  745.                         break;
  746.  
  747.                     case SLIDER_KIND:
  748.  
  749.                         Gadget = CreateGadget(SLIDER_KIND,Handle->Previous,&NewGadget,
  750.                             GTSL_Min,            Node->Min,
  751.                             GTSL_Max,            Node->Max,
  752.                             GTSL_Level,            Node->Current,
  753.                             GTSL_MaxLevelLen,    Node->Special.Slider.MaxLevelLen,
  754.                             GTSL_LevelPlace,    Node->Special.Slider.LevelPlace,
  755.                             GTSL_LevelFormat,    Node->Special.Slider.LevelFormat ? Node->Special.Slider.LevelFormat : (STRPTR)"%ld",
  756.                             GA_RelVerify,        TRUE,
  757.  
  758.                             V40 ? GTSL_MaxPixelLen : TAG_IGNORE,                        Node->Special.Slider.LevelWidth,
  759.                             V40 ? GTSL_Justification : TAG_IGNORE,                        GTJ_RIGHT,
  760.                             Node->Special.Slider.DispFunc ? GTSL_DispFunc : TAG_IGNORE,    Node->Special.Slider.DispFunc,
  761.                         TAG_MORE,Tags);
  762.  
  763.                         break;
  764.  
  765.                     case SCROLLER_KIND:
  766.  
  767.                         Gadget = CreateGadget(SCROLLER_KIND,Handle->Previous,&NewGadget,
  768.                             GA_RelVerify,    Node->Special.Scroller.RelVerify,
  769.                             GA_Immediate,    Node->Special.Scroller.Immediate,
  770.                             GTSC_Top,        Node->Current,
  771.                             GTSC_Total,        Node->Max,
  772.                             GTSC_Visible,    Node->Special.Scroller.Visible,
  773.                             PGA_Freedom,    Node->Special.Scroller.Vertical ? LORIENT_VERT : LORIENT_HORIZ,
  774.  
  775.                             Node->Special.Scroller.Arrows ? GTSC_Arrows : TAG_IGNORE,Node->Special.Scroller.ArrowSize,
  776.                         TAG_MORE,Tags);
  777.  
  778.                         break;
  779.  
  780.                     case STRING_KIND:
  781.  
  782.                         if(Node->Special.String.LinkID != -1)
  783.                         {
  784.                             ObjectNode *ListView = LTP_FindNode(Handle,Node->Special.String.LinkID);
  785.  
  786.                             if(ListView)
  787.                             {
  788.                                 NewGadget.ng_LeftEdge    = ListView->Left;
  789.                                 NewGadget.ng_TopEdge    = ListView->Top + ListView->Height;
  790.                                 NewGadget.ng_Width        = ListView->Width;
  791.                             }
  792.                         }
  793.  
  794.                         if(Node->Special.String.UsePicker)
  795.                             NewGadget.ng_Width -= LTP_GetPickerSize(Handle);
  796.  
  797.                         if(Gadget = CreateGadget(STRING_KIND,Handle->Previous,&NewGadget,
  798.                             GTST_String,            Node->Special.String.String,
  799.                             GTST_MaxChars,            Node->Special.String.MaxChars,
  800.                             GTST_EditHook,            Node->Special.String.EditHook ? Node->Special.String.EditHook : Handle->StandardEditHook,
  801.                             GA_Immediate,            TRUE,
  802.                             STRINGA_Justification,    Node->Special.String.Justification,
  803.                             STRINGA_ExitHelp,        Handle->HelpHook != NULL,
  804.                         TAG_MORE,Tags))
  805.                         {
  806.                             if(!V39)
  807.                                 Gadget->Activation |= GACT_IMMEDIATE;
  808.  
  809.                             if(Node->Special.String.UsePicker)
  810.                             {
  811.                                 Handle->Previous = Gadget;
  812.  
  813.                                 Extra = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_PICKER,0);
  814.  
  815.                                 if(!Extra)
  816.                                     Gadget = NULL;
  817.  
  818.                                 Node->Special.String.Picker = Extra;
  819.                             }
  820.                         }
  821.  
  822.                         break;
  823. #ifdef DO_PASSWORD_KIND
  824.                     case PASSWORD_KIND:
  825.                     {
  826.                         LONG Len;
  827.  
  828.                         if(Len = strlen(Node->Special.String.RealString))
  829.                             memset(Node->Special.String.Original,'·',Len);
  830.  
  831.                         Node->Special.String.Original[Len] = 0;
  832.  
  833.                         if(Gadget = CreateGadget(STRING_KIND,Handle->Previous,&NewGadget,
  834.                             GTST_String,            Node->Special.String.Original,
  835.                             GTST_MaxChars,            Node->Special.String.MaxChars,
  836.                             GTST_EditHook,            &Handle->PasswordEditHook,
  837.                             GA_Immediate,            TRUE,
  838.                             STRINGA_Justification,    Node->Special.String.Justification,
  839.                             STRINGA_ExitHelp,        Handle->HelpHook != NULL,
  840.                         TAG_MORE,Tags))
  841.                         {
  842.                             if(!V39)
  843.                                 Gadget->Activation |= GACT_IMMEDIATE;
  844.                         }
  845.  
  846.                         break;
  847.                     }
  848. #endif
  849.  
  850.                     case INTEGER_KIND:
  851.  
  852.                         if(Node->Special.Integer.UseIncrementers)
  853.                         {
  854.                             NewGadget.ng_Width -= 4 + Handle->GlyphWidth + 4;
  855.                             NewGadget.ng_Width -= 4 + Handle->GlyphWidth + 4;
  856.  
  857.                             if(Node->Special.Integer.IncrementerHook)
  858.                             {
  859.                                 LONG Value;
  860.  
  861.                                 Value = (LONG)CallHookPkt(Node->Special.Integer.IncrementerHook,(APTR)Node->Special.Integer.Number,(APTR)INCREMENTERMSG_INITIAL);
  862.  
  863.                                 if(Value < Node->Min)
  864.                                     Value = Node->Min;
  865.                                 else
  866.                                 {
  867.                                     if(Value > Node->Max)
  868.                                         Value = Node->Max;
  869.                                 }
  870.  
  871.                                 Node->Special.Integer.Number = Value;
  872.                             }
  873.                         }
  874.  
  875. #ifndef DO_HEXHOOK
  876.                         Gadget = CreateGadget(INTEGER_KIND,Handle->Previous,&NewGadget,
  877.                             GTIN_Number,            Node->Special.Integer.Number,
  878.                             GTIN_MaxChars,            Node->Special.Integer.MaxChars,
  879.                             GTIN_EditHook,            Node->Special.Integer.EditHook ? Node->Special.Integer.EditHook : Handle->StandardEditHook,
  880.                             GA_Immediate,            TRUE,
  881.                             STRINGA_Justification,    Node->Special.Integer.Justification,
  882.                             STRINGA_ExitHelp,        Handle->HelpHook != NULL,
  883.                         TAG_MORE,Tags);
  884. #else
  885.                         if(Node->Special.Integer.EditHook)
  886.                         {
  887.                             Gadget = CreateGadget(INTEGER_KIND,Handle->Previous,&NewGadget,
  888.                                 GTIN_Number,            Node->Special.Integer.Number,
  889.                                 GTIN_MaxChars,            Node->Special.Integer.MaxChars,
  890.                                 GTIN_EditHook,            Node->Special.Integer.EditHook,
  891.                                 GA_Immediate,            TRUE,
  892.                                 STRINGA_Justification,    Node->Special.Integer.Justification,
  893.                                 STRINGA_ExitHelp,        Handle->HelpHook != NULL,
  894.                             TAG_MORE,Tags);
  895.                         }
  896.                         else
  897.                         {
  898.                             UBYTE LocalBuffer[20];
  899.  
  900.                             SPrintf(LocalBuffer,"%ld",Node->Special.Integer.Number);
  901.  
  902.                             Gadget = CreateGadget(STRING_KIND,Handle->Previous,&NewGadget,
  903.                                 GTST_String,            LocalBuffer,
  904.                                 GTST_MaxChars,            Node->Special.Integer.MaxChars,
  905.                                 GTST_EditHook,            &Handle->HexEditHook,
  906.                                 GA_Immediate,            TRUE,
  907.                                 STRINGA_Justification,    Node->Special.Integer.Justification,
  908.                                 STRINGA_ExitHelp,        Handle->HelpHook != NULL,
  909.                             TAG_MORE,Tags);
  910.                         }
  911.  
  912.                         if(Gadget)
  913.                         {
  914.                             struct StringInfo *StringInfo = (struct StringInfo *)Gadget->SpecialInfo;
  915.  
  916.                             StringInfo->LongInt = Node->Special.Integer.Number;
  917.                         }
  918. #endif
  919.  
  920.                         if(Gadget)
  921.                         {
  922.                             if(!V39)
  923.                                 Gadget->Activation |= GACT_IMMEDIATE;
  924.  
  925.                             if(Node->Special.Integer.UseIncrementers)
  926.                             {
  927.                                 Handle->Previous = Gadget;
  928.  
  929.                                 if(Node->Special.Integer.LeftIncrementer = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_LEFTINCREMENTER,-1))
  930.                                 {
  931.                                     Handle->Previous = Node->Special.Integer.LeftIncrementer;
  932.  
  933.                                     if(Node->Special.Integer.RightIncrementer = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_RIGHTINCREMENTER,1))
  934.                                         Extra = Node->Special.Integer.RightIncrementer;
  935.                                     else
  936.                                         Gadget = NULL;
  937.                                 }
  938.                                 else
  939.                                     Gadget = NULL;
  940.                             }
  941.                         }
  942.  
  943.                         break;
  944.                 }
  945.  
  946.                 if(Gadget)
  947.                 {
  948.                     Handle->GadgetArray[Handle->Index++] = Gadget;
  949.  
  950.                     Node->Host = Gadget;
  951. #ifdef DO_BOOPSI_KIND
  952.                     if(Node->Type == BOOPSI_KIND || Node->Type == POPUP_KIND || Node->Type == TAB_KIND)
  953.                     {
  954.                         Handle->BOOPSIPrevious = (Object *)Gadget;
  955.  
  956.                         if(!Handle->BOOPSIList)
  957.                             Handle->BOOPSIList = (Object *)Gadget;
  958.                     }
  959.                     else
  960.                     {
  961.                         if(Extra)
  962.                             Handle->Previous = Extra;
  963.                         else
  964.                             Handle->Previous = Gadget;
  965.                     }
  966. #else
  967.                     if(Extra)
  968.                         Handle->Previous = Extra;
  969.                     else
  970.                         Handle->Previous = Gadget;
  971. #endif    /* DO_BOOPSI_KIND */
  972.                 }
  973.                 else
  974.                 {
  975.                     Handle->Failed = TRUE;
  976.  
  977.                     return;
  978.                 }
  979.             }
  980.         }
  981.     }
  982. }
  983.